import { oraPromise } from 'ora';
import { format } from './util.js';

const noop = Promise.resolve();

class Spinner {
    constructor({ container = {} } = {}) {
        this.config = container.config;
        this.ora = container.ora || oraPromise;
    }
    show({ enabled = true, task, label, external = false, context }) {
        if (!enabled) {
            return noop;
        }

        const { config } = this;
        this.isSpinnerDisabled = !config.isCI || config.isVerbose || config.isDryRun || config.isDebug;
        this.canForce = !config.isCI && !config.isVerbose && !config.isDryRun && !config.isDebug;

        const awaitTask = task();

        if (!this.isSpinnerDisabled || (external && this.canForce)) {
            const text = format(label, context);
            this.ora(awaitTask, text);
        }

        return awaitTask;
    }
}

export default Spinner;
